#include "stm32f1xx_hal.h"
#include "onewire.h"
#include "bsp_tim.h"


// 开始函数
uint8_t OneWire_Start(void)
{
    uint8_t AckBit = 0;
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_SET);   // 拉高
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_RESET); // 拉低
    Delay_us(500);                                                // 延时
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_SET);   // 拉高
    Delay_us(70);                                                 // 延时
    AckBit = HAL_GPIO_ReadPin(OW_GPIO_PORT, OW_GPIO_PIN);         // 读取
    Delay_us(500);                                                // 延时
    return AckBit;                                                // 返回
}

// 发送一位
void OneWire_SendBit(uint8_t Bit)
{
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_RESET);                      // 拉低
    Delay_us(5);                                                                       // 延时
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, Bit ? GPIO_PIN_SET : GPIO_PIN_RESET); // 根据Bit的值设置
    Delay_us(55);                                                                      // 延时
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_SET);                        // 拉高
}

// 接收一位
uint8_t OneWire_ReceiveBit(void)
{
    uint8_t Bit = 0;
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_RESET); // 拉低
    Delay_us(5);                                                  // 延时
    HAL_GPIO_WritePin(OW_GPIO_PORT, OW_GPIO_PIN, GPIO_PIN_SET);   // 拉高
    Delay_us(5);                                                  // 延时
    Bit = HAL_GPIO_ReadPin(OW_GPIO_PORT, OW_GPIO_PIN);            // 读取
    Delay_us(50);                                                 // 延时
    return Bit;                                                   // 返回
}

// 发送一个字节
void OneWire_SendByte(uint8_t Byte)
{
    uint8_t i = 0;
    for (i = 0; i < 8; i++) // 循环8次
    {
        OneWire_SendBit(Byte & (0x01 << i)); // 发送一位 //右移一位
    }
}

// 接收一个字节
uint8_t OneWire_ReceiveByte(void)
{
    uint8_t i = 0, Byte = 0x00;
    for (i = 0; i < 8; i++) // 循环8次
    {
        if (OneWire_ReceiveBit())
        {
            Byte |= (0x01 << i); // 接收一位 //左移一位
        }
    }
    return Byte; // 返回
}